無秩序なif-elseは死ねば良いのに


概要

ポエムです。



無秩序なif-elseは死ねば良いのにと思う理由

if-else書かなきゃいけないとき、それが

if {} に対して排他的な要素をelse {} に書かなきゃいけないんだが、


if situation {

route A

} else {

route B

}


なんっつーーーか単純に負けた感じするんだよな。

状況を読み切れてないというか、打算的ではない感じがする。

考えるのサボったんじゃねえのみたいな。



変更可能性を高く保ちたい

自分が感じるif-elseの最高に嫌いなところは、

if-elseなコードは将来の変更可能性を著しく損なう ということにある気がした。


あとで変更加えるときに


「これはelseにくる場合の可能性をどれだけ考慮してるか」


っていうのを「変更したくなったその都度、コードから」見ないといけない。

これはとてもとても面倒臭い。


で、読むのが面倒くさい = 取りうる値が自明であることが読みにくいコード = 変更可能性が低いコード、

という式が自分の中で成立してしまう。


状態を持ったコードなんかもそうなんだけど、

状態を持たないコードであっても、値の範囲がパッと読めないだけで苦しくなる。


で、これをどう改善しようかみたいに考える。



例を殴って直そう

例えば

string a = GetResult


if a == “something” {

route A

} else {

route B

}


みたいなコードがあったとして、elseに来る可能性があるaの中身は、実際なんだろう。

スッゲー膨大になるよな。


route Bにくるときのパターンは “somethingではない” くらいの情報しか無い。

これを今から殴りたい。


自明化

できればif文に乗ってくる要素がcontextとして一列に並べられるような設計にして、

かつそれらを選択肢が網羅していることが自明であると嬉しい。


まずは取り得る選択肢の幅そのものを小さくできないものか。


enum a = GetResult


if a == enum .enumA {

route A

} else {

route B

ここにくるのは少なくともenumに定義された何かっぽい気がする

}


このへんがif-elseの限界で、行き詰まる。

で、じゃあif捨てよーぜって感じで、switchとかmatchとか。

この時点で選べない言語が出てくるが気にしない。


enum a = GetResult


switch a {

case enum.enumA:

route A

break


default:

route B

break

}


さらに、取り得る選択肢がexhaustiveな要素だと自動的に明示できるようだと素晴らしい。

けどこれは出来る言語見たこと無い。


enum a = GetResult


switch a {

case enum.enumA:

route A

break


default: <- not exhausted yet. enum.enumB, enum.enumC is not used in this block

route B

break

}


default(wildcard)があるにも関わらず、ピンクな部分のエラーを出せる言語を自分は知らない。

っていうかshould exhaustなenumとかがあればそういうのできる言語ありそうな気がする。

ここから先はスピリチュアルな変更を伴う感じの調整が出来る。

そもそもenumの要素がすべて現れ、かつ使われるような要素になるように

「考え直す」とか。


飽きたのでここまでにする。


ぶっちゃけコンパイラが賢い言語でswitchとかmatchが使えると平滑にする術が増えるし

幸せになれるなって感じ。

転じてifの価値は低い。




オチは無いです。